/*
[编程题]假期(0.2)
time:20210318 13:18 PM
key:1.通过将前一天压入栈来在下一轮检查栈顶来确定是否连续两天同样
user：ldc
*/

#include <iostream>
#include<iomanip>  
#include <iterator>
#include<stack>
#include<algorithm>
#include<queue>
#include<vector>
#include<math.h>
using namespace std;

class Date
{
public:
	bool work;
	bool exe;
	Date()
	{
		work = 0;
		exe = 0;
	}
	Date(bool a, bool b)
	{
		work = a;
		exe = b;
	}
};
int main()
{

	//健身房
	vector<int>J;
	//公司
	vector<int>G;
	int i, n, x, j;
	cin >> n;
	for (i = 0; i < n; i++)
	{
		cin >> x;
		G.push_back(x);
	}
	for (i = 0; i < n; i++)
	{
		cin >> x;
		J.push_back(x);
	}
	//新类数组
	Date* D = new Date[n];
	//输入类
	for (i = 0; i < n; i++)
	{
		D[i] = Date(G[i], J[i]);
	}
	//遍历日程类，题目求休息的最少天数，就是能去工作锻炼就去工作锻炼。

	//休息的最少天数
	int count2 = 0;
	//状态栈
	stack<bool>flag;
	for (i = 0; i < n; i++)
	{
		//第一次写忽略了隔一天也可以的条件判断
		//第二次还忽略了如果都可以的情况下哪个优先，原来默认了公司优先。应该是明天关门的优先。
		if (D[i].work == 1 && D[i].exe == 1)
		{
			if (i <= n - 1)//如果是最后一天都开门，那必定不休息，所以不考虑
			{
				//如果栈是空的，就只考虑后边有且只有一个开门的状况(其余状况延续执行)，考虑完就不执行下面了
				if (flag.empty())
				{
					if (D[i + 1].work == 1 && D[i + 1].exe == 0)
					{
						flag.push(0);
						continue;
					}
					if (D[i + 1].exe == 1 && D[i + 1].work == 0)
					{
						flag.push(1);
						continue;
					}
					
				}
			}

		}
		//能工作吗（检查公司是否营业）
		if (D[i].work == 1 && (flag.empty() || (!flag.empty() && flag.top() == 0)))
		{
			//状态非空且昨天不同
			flag.push(1);

		}
		else if (D[i].exe == 1 && (flag.empty() || (!flag.empty() && flag.top() == 1)))
			//能健身吗（检查连续健身计数器和健身是否营业）
		{

			flag.push(0);
		}
		else//都不行就去休息
		{
			count2++;
			//休息归零
			while (!flag.empty())
			{
				flag.pop();
			}

		}

	}
	cout << count2;
}

